const Koa = require("koa")
const KoaRouter = require("koa-router")
const koaBody = require("koa-body")
const koaStatic = require("koa-static-cache")
const koaViews = require("koa-views")
const session = require('koa-session')

// 创建实例
const app = new Koa()
const router = new KoaRouter()

// 引入数据 
const categories = require("./data/categories.json")
const items = require("./data/items.json")

// 配置中间件
app.use(koaStatic({
  prefix: "/public",
  dir: "./public",
  gzip: true,
  dynamic: true
}))
app.use(koaBody())
app.use(koaViews(__dirname + "/views", {
  map: {
    "html": "nunjucks"
  }
}))

app.keys = ['shengbang123@231321']  // 加密规则 ，不要泄露给其他人
const CONFIG = {
  key: 'koa:shengbang',   // cookie key (default is koa:sess)
  maxAge: 86400000,  // cookie的过期时间 maxAge in ms (default is 1 days)
  overwrite: true,  //是否可以overwrite    (默认default true)
  httpOnly: true, //cookie是否只有服务器端可以访问 httpOnly or not (default true)
  signed: true,   //签名默认true
  rolling: false,  //在每次请求时强行设置cookie，这将重置cookie过期时间（默认：false）
  renew: false,  //(boolean) renew session when session is nearly expired,
}
// 注册中间件
app.use(session(CONFIG, app))

// 配置全局变量
app.use(async (ctx, next) => {
  // koa 提供了 state 对象 ，用于通过中间件传递信息到前端视图，所有前端视图都可以直接使用信息
  ctx.state.categories = categories
  if (ctx.session.user) {
    ctx.state.user = ctx.session.user
  }
  await next()
})

// 获取指定类目详细信息
async function getCategory(id, arr) {
  return arr.find(category => {
    return category.id == id
  })
}

// 获取指定类目下的所有数据
async function getCateItems(id, arr) {
  return arr.filter(item => {
    return id == item.category_id
  })
}

// 获取商品详细信息
async function getDetail(id, arr) {
  return arr.find(item => {
    return id == item.id
  })
}

// 配置路由

// 首页
router.get("/", async ctx => {
  console.log(ctx.state.user)
  await ctx.render("index", {
    items
  })
})

// 列表页面
router.get("/list/:categoryId", async ctx => {
  const { categoryId: id } = ctx.params  // {categoryId:"123"}
  // 获取对应类别的数据
  const category = await getCategory(id, categories)
  const cateItems = await getCateItems(id, items)

  await ctx.render("list", {
    category,
    items: cateItems
  })
})

// 详情页面
router.get("/detail/:itemId", async ctx => {
  const { itemId } = ctx.params
  const item = await getDetail(itemId, items)
  const category = await getCategory(item.category_id, categories)
  await ctx.render("detail", {
    category,
    item
  })
})

// 注册页面
router.get("/signup", async ctx => {
  await ctx.render("signup", {
    items
  })
})

const users = [
  {
    id: 1,
    username: "zhangsan",
    password: "123456"
  },
  {
    id: 2,
    username: "admin",
    password: "123456"
  }
]

// 注册提交处理
router.post("/signup", async ctx => {


})

// 登录
router.get("/signin", async ctx => {
  await ctx.render("signin")
})

// 登录提交处理
router.post("/signin", async ctx => {

  const { username, password } = ctx.request.body

  // 在数组中匹配指定的数据，如果匹配成功返回true，否则是false
  // 会直接遍历数组
  const isMatched = users.some(user => {
    return user.username == username && user.password == password
  })
  if (isMatched) {
    ctx.session.user = { username }
    ctx.redirect("/")
  } else {
    ctx.body = "用户名或密码错误"
  }
})

// 个人信息页面
router.get("/user", async ctx => {
  await ctx.render("user")
})


// 配置中间件
app.use(router.routes())

// 监听
app.listen(8090, () => {
  console.log("run on port 8090")
})
